[코담]
웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트
출판사 정산용 도서 판매 분석 API | ✅저자: 이유정(박사)
✅ 시나리오: 출판사 정산용 도서 판매 분석 API
- 매일 아침
book_orders.json
파일을 읽어, - 출판사는 아래 정보를 대시보드로 확인하고자 합니다:
요구 API
- 출판사별 총 매출 합계 (
GET /books/publisher/
) - 장르별 도서 수익 평균 (
GET /books/genre-avg/
)
단, 총 판매량이 2건 이상인 장르만 포함
✅ 원시 데이터: book_orders.json
[
{ "order_id": "B001", "title": "파이썬 기초", "genre": "프로그래밍", "publisher": "한빛미디어", "price": 18000, "quantity": 2, "order_date": "2025-06-18" },
{ "order_id": "B002", "title": "자바 입문", "genre": "프로그래밍", "publisher": "이지스퍼블리싱", "price": 20000, "quantity": 1, "order_date": "2025-06-18" },
{ "order_id": "B003", "title": "데이터 분석", "genre": "데이터", "publisher": "한빛미디어", "price": 25000, "quantity": 2, "order_date": "2025-06-19" },
{ "order_id": "B004", "title": "감정 수업", "genre": "인문", "publisher": "민음사", "price": 14000, "quantity": 1, "order_date": "2025-06-19" }
]
utils.py
import os
import json
from django.conf import settings
def load_book_orders():
"""book_orders.json 파일을 읽어 리스트로 반환"""
path = os.path.join(settings.______, 'book_orders.json')
with open(path, encoding='utf-8') as f:
return json.____(f)
views.py
from django.http import JsonResponse
from .utils import load_book_orders
def publisher_revenue(request):
"""
출판사별 총 매출 합계
예시 결과: [{"publisher": "한빛미디어", "revenue": 86000}, …]
"""
data = load_book_orders()
result = {}
for item in data:
pub = item["publisher"]
sales = item["____"] * item["____"]
result[pub] = result.get(pub, 0) + sales
response = [{"publisher": k, "revenue": v} for k, v in sorted(result.items())]
return JsonResponse(response, safe=____)
def genre_average_revenue(request):
"""
장르별 평균 수익 (단, 총 판매량 2건 이상만 포함)
예시 결과: [{"genre": "프로그래밍", "average_revenue": 19000.0}]
"""
data = load_book_orders()
total_sales = {}
total_qty = {}
for item in data:
genre = item["____"]
sales = item["price"] * item["quantity"]
qty = item["quantity"]
total_sales[genre] = total_sales.get(genre, 0) + sales
total_qty[genre] = total_qty.get(genre, 0) + qty
response = []
for g in sorted(total_sales.keys()):
if total_qty[g] >= ____:
avg = total_sales[g] / total_qty[g]
response.append({"genre": g, "average_revenue": round(avg, 1)})
return JsonResponse(response, safe=____)
정답:
path = os.path.join(settings.BASE_DIR, 'book_orders.json')
json.load(f)
views.py
# publisher_revenue
sales = item["price"] * item["quantity"]
safe=False
# genre_average_revenue
genre = item["genre"]
if total_qty[g] >= 2
safe=False
✅의사코드: 출판사별 총 매출 합계 API
1. JSON 파일 읽기
2. 빈 딕셔너리 result 생성
3. 각 주문마다:
- 출판사 이름 가져오기
- 판매액 계산 (price × quantity)
- 출판사별 매출 누적
1. 정렬된 리스트로 변환해 JsonResponse 반환
장르별 평균 단가 API
1. JSON 파일 읽기
2. 장르별로 total_sales, total_qty 딕셔너리 생성
3. 각 주문마다:
- 장르별 매출 누적, 수량 누적
4. 각 장르마다:
- 수량이 2 이상이면 평균 = 총매출 / 총수량
- 결과 리스트에 추가
1. JsonResponse 반환